package com.winit.schedule.job.tracker.repository;

import java.util.List;

import com.winit.schedule.core.model.AssignedTask;
import com.winit.schedule.core.model.TaskID;
import com.winit.schedule.core.repository.entity.QuartzJobEntity;
import com.winit.schedule.core.repository.entity.QuartzSchedulerEntity;
import com.winit.schedule.core.repository.entity.TaskEntity;
import com.winit.schedule.core.repository.entity.TaskItemEntity;
import com.winit.schedule.core.repository.entity.TaskRunRecordEntity;
import com.winit.schedule.core.repository.entity.TaskRunnerEntity;
import com.winit.schedule.core.repository.entity.TaskTrackerEntity;
import com.winit.schedule.core.repository.query.TaskItemQuery;
import com.winit.schedule.core.task.ScheduleTaskDefine;

/**
 * 调度数据管理
 * 
 * @author jianke.zhang 2015-4-16 下午6:25:54
 * @since 1.0
 */
public interface ScheduleDataManager extends LogDataManager {

    /**
     * 根据任务ID查询任务实体
     * 
     * @param taskId
     * @return
     */
    TaskEntity getTaskEntityById(String taskId);

    /**
     * 同步查找并抓取可执行任务；必须按最后抓取时间（lastFetchTime）和参数（parameter）排序获取
     * 
     * @param taskTrackerUuid
     * @param taskId
     * @param nextRunTime
     * @param fetchNum
     * @return
     */
    TaskItemEntity findAndFetchTaskItemByTaskId(String taskTrackerUuid, String taskId, long nextRunTime, int fetchNum);

    /**
     * 获取任务项在每台tasktracker上的平均负载数量
     * 
     * @param taskId
     * @return
     */
    long getTaskItemNumberOfPerTasktracker(String taskId);

    /**
     * 将push失败的taskitem状态重置为INACTIVITE,
     * 
     * @param timeout
     * @return
     */
    void recoveryPushFailureTaskItem(long timeout);

    /**
     * 根据超时时间清除数据库已经过去的taskTracker和taskRunner
     * 
     * @param timeout
     * @return
     */
    void removeTaskTrackerAndRunnerForTimeout(long heartbeatTimeout);

    /**
     * 根据tasktrackerUuid清除taskTracker和taskrunner信息
     * 
     * @param timeout
     */
    void removeTaskTrackerAndRunnerByUuid(String taskTrackerUuid);

    /**
     * 根据taskRunneruuid更新TaskItem的状态
     * 
     * @param taskId
     * @param taskRunnerUuid
     * @param status
     */
    void updateTaskItemStatusByTaskRunnerUuid(TaskItemEntity taskItem);

    /**
     * 根据tasktrackeruuid查询tasktracker
     * 
     * @param uuid
     * @return
     */
    TaskTrackerEntity getTaskTrackerByUuId(String uuid);

    /**
     * 保存或者更新TaskTracker，同时更新任务的接口定义信息
     * 
     * @param entity
     * @return
     */
    TaskTrackerEntity saveOrUpdateTaskTrackerAndUpdateTaskInterfaceType(TaskTrackerEntity entity);

    /**
     * 更新tasktracker的心跳时间
     * 
     * @param entity
     * @return
     */
    TaskTrackerEntity updateHeartbeatTime(TaskTrackerEntity entity);

    /**
     * 更新运行线程组信息
     * 
     * @param runners
     */
    void updateTaskRunnerForTaskItem(TaskItemEntity taskItemEntity);

    /**
     * 查询所有已停止任务的ID
     * 
     * @return
     */
    List<TaskID> queryAllStopTaskIDs();

    /**
     * 非周期性任务执行完成
     * 
     * @param taskId
     * @param status
     */
    void completeTask(TaskRunnerEntity taskRunner, AssignedTask task);

    /**
     * 存储任务项运行记录
     * 
     * @param taskRunRecord
     */
    void saveTaskRunRecord(TaskRunRecordEntity taskRunRecord);

    /**
     * 更新quartz定时任务信息
     * 
     * @param schedulers
     */
    void updateQuartzScheduler(List<QuartzSchedulerEntity> schedulers);

    /**
     * taskTracker断开连接后，清除quartz数据
     * 
     * @param taskTrackerUuid
     */
    void deleteQuartzScheduler(String taskTrackerUuid);

    /**
     * taskTracker通过心跳取走命令后，清除命令信息
     * 
     * @param taskTrackerUuid
     */
    void cleanQuartzCommand(String taskTrackerUuid);

    /**
     * 查询待执行的quartz命令
     * 
     * @param taskTrackerUuid
     * @return
     */
    List<QuartzJobEntity> queryJobCommnads(String taskTrackerUuid);

    /**
     * 查询待执行的quartz命令
     * 
     * @param taskTrackerUuid
     * @return
     */
    List<QuartzSchedulerEntity> querySchedulerCommnads(String taskTrackerUuid);

    /**
     * 清除所有失效的quartz数据
     * 
     * @param timeout
     * @return
     */
    void cleanQuartzTimeout(long timeout);

    /**
     * 查询状态异常的taskItems
     * 
     * @param query
     * @return
     */
    List<TaskItemEntity> queryTaskItemsByTimeout(TaskItemQuery query);

    /**
     * 删除小于logTime的日志信息
     * 
     * @param logTime
     * @return
     */
    int deleteLogByLogtime(long logTime);

    /**
     * 删除小于runStartTime的日志信息
     * 
     * @param logTime
     * @return
     */
    int deleteRunRecordByStarttime(long runStartTime);

    /**
     * 保存任务定义并更新任务信息
     * @param taskDefine
     * @param taskTrackerUUID
     */
    void saveScheduleTaskDefine(ScheduleTaskDefine taskDefine, String taskTrackerUUID);

    /**
     * 验证IP地址是否在白名单中
     * @param ipaddress
     * @return
     */
    boolean containBlackList(String ipaddress);

    /**
     * 刷新黑名单缓存
     * @return
     */
    boolean resetBlackListCache(String blackList);

    /**
     * 根据taskGroup查询所有任务ID
     * @return
     */
    List<TaskID> queryAllTaskIdByTaskTracker(String taskGroup);
}
